#!/bin/bash

. /usr/voltaire/common.sh
if [ -f /etc/redhat-release ] ; then
	LIN_DIST=RH
elif [ -f /etc/SuSE-release ] ; then
	LIN_DIST=SUSE
fi


function make_pkey_network(){
	nib1=$(echo $given_network|cut -f1 -d.)
	nib2=$(echo $given_network|cut -f2 -d.)
	nib3=$(echo $given_network|cut -f3 -d.)
	nib4=$(echo $given_network|cut -f4 -d.)
	pkey=$(echo $given_if|cut -s -f2 -d.)
	if [ -z $pkey ] ; then
		fatal "not a child interface. don't use pkey option"
	fi
	pkey=0x$pkey	
	low_pkey=$(($pkey&0x00ff))
	given_network=$nib1.$low_pkey.$nib3.$nib4
}
function choose_netscript(){
	ib_if=$1
       if [ $show -ne 0 ] ; then
	   netscript=$(tty)
	   becho "Writing network configuration to standard output and not to file"
	   return 0
       fi
       case "${LIN_DIST}" in
           rhas21|rh90|rh80|rh73|rhas3|rhas4|rhes4|RH)
			   netscript=/etc/sysconfig/network-scripts/ifcfg-$ib_if
		   ;;
           sles80|sl80|sl81|sul10|suse9|suse9.1|sles9|suse92|suse990|SUSE)
			   netscript=/etc/sysconfig/network/ifcfg-$ib_if
		   ;;
           *) 
           exec 2>/dev/tty
	   becho  "$LIN_DIST: Unsupported distribution ..."
	   exit 1
           ;;
       esac
       if [ -f $netscript ] ; then
		if [ $overwrite -eq 0 ] ; then
			becho "Configuration file $netscript already exists. Use option -overwrite to replace it"
			exit 1
		fi
		if [ $backup_netscript -eq 1 ] ; then
			now=$(date +%d.%B.%Y-%H:%M:%S)
			cp $netscript $netscript.backup.$now
			becho "Old configuration was backed up to $netscript.backup.$now"
		fi
		rm -f $netscript
       fi
}
function dhclient_set(){
	ib_if=$1
	parent_ib_if=$(echo $ib_if|cut -f1 -d.)
	if [ -f /sys/class/net/$parent_ib_if/address ] ; then
		dhcp_clinet_id=$(cat /sys/class/net/$parent_ib_if/address |cut -f5-20 -d:)
	else
		fatal interface $parent_ib_if does not exist
	fi
	dhcp_line="interface \"$ib_if\" { send dhcp-client-identifier $dhcp_clinet_id; }"
	if [ $show -ne 0 ] ; then
		becho "Writing dhcp configuration to standard output and not to file"
		echo $dhcp_line
	else
		grep -v \"$ib_if\" /etc/dhclient.conf > /tmp/dhclient.conf
		echo $dhcp_line >> /tmp/dhclient.conf
		cat  /tmp/dhclient.conf > /etc/dhclient.conf
	fi

}
	
function ib_dynamic_set() {
       ib_if=$1
       exec 2>/dev/null
       #copy the relevant file(s)
       case "${LIN_DIST}" in
           rhas21|rh90|rh80|rh73|rhas3|rhas4|rhes4|RH)
		   echo "DEVICE=$ib_if" 	>> $netscript
		   if [[ $ib_if_active -ne 0 ]]; then
			echo "ONBOOT=yes" 	>> $netscript
		   else
			echo "ONBOOT=no" 	>> $netscript
		   fi
		   echo "BOOTPROTO=dhcp" 	>> $netscript
		   ;;
           sles80|sl80|sl81|sul10|suse9|suse9.1|sles9|suse92|suse990|SUSE)
		   echo "PRE_UP_SCRIPT=/etc/sysconfig/network/ifup-pre-ib" >> 		$netscript
		   echo "POST_DOWN_SCRIPT=/etc/sysconfig/network/ifdown-post-ib" >>	$netscript
		   echo "BOOTPROTO='dhcp'"	>> $netscript
		   ;;
           *) 
           exec 2>/dev/tty
	   becho  "Unsupported distribution ..."
	   exit 1
           ;;
       esac
       
       exec 2>/dev/tty
       if [ $show -eq 0 ] ; then
	       info wrote $ib_if configuration to $netscript
	       cat $netscript|xargs
       fi
       return 0

}
function ib_static_set() {
	ib_if=$1
	ib_ip=$2
	ib_network=$3
	ib_netmask=$4
	ib_bc=$5
	ib_mtu=$6
	ib_if_active=$7
       exec 2>/dev/null
       #copy the relevant file(s)
       case "${LIN_DIST}" in
           rhas21|rh90|rh80|rh73|rhas3|rhas4|rhes4|RH)

		   echo "DEVICE=$ib_if" 	>> $netscript
		   if [[ $ib_if_active -ne 0 ]]; then
			echo "ONBOOT=yes" 	>> $netscript
		   else
			echo "ONBOOT=no" 	>> $netscript
		   fi
		   echo "BOOTPROTO=static" 	>> $netscript
		   echo "IPADDR=$ib_ip" 	>> $netscript
		   echo "NETWORK=$ib_network" 	>> $netscript
		   echo "NETMASK=$ib_netmask" 	>> $netscript
		   echo "BROADCAST=$ib_bc" 	>> $netscript
		   echo "MTU=$ib_mtu" 		>> $netscript
		   ;;
           sles80|sl80|sl81|sul10|suse9|suse9.1|sles9|suse92|suse990|SUSE)
		   echo "PRE_UP_SCRIPT=/etc/sysconfig/network/ifup-pre-ib" >> 		$netscript
		   echo "POST_DOWN_SCRIPT=/etc/sysconfig/network/ifdown-post-ib" >>	$netscript
		   echo "BOOTPROTO='static'"	>> $netscript
		   echo "STARTMODE='onboot'"	>> $netscript
		   echo "REMOTE_IPADDR=''"	>> $netscript
		   echo "WIRELESS='no'"		>> $netscript
		   echo "IPADDR=$ib_ip"  	>> $netscript
		   echo "NETWORK=$ib_network"	>> $netscript
		   echo "NETMASK=$ib_netmask" 	>> $netscript
		   echo "BROADCAST=$ib_bc" 	>> $netscript
		   echo "MTU=$ib_mtu" 		>> $netscript
		   ;;
           *) 
           exec 2>/dev/tty
	   becho  "Unsupported distribution ..."
	   exit 1
           ;;
       esac

       exec 2>/dev/tty
       if [ $show -eq 0 ] ; then
	       info wrote $ib_if configuration to $netscript
	       cat $netscript|xargs
       fi
       return 0

}

function get_eth {
	eth_if=$1
       	exec 2>/dev/null
	if [ -z $eth_if ] ; then
       		exec 2>/dev/tty
		return 1
	fi
	ifconfig $eth_if > /dev/null
	if [ $? -ne 0 ] ; then
       		exec 2>/dev/tty
		return 1
	fi

	eth_ip=$(ifconfig ${eth_if} 2>/dev/null | perl -ne 'print "$1\n"if/inet addr:\s*(\S+)/i')
        eth_nm=$(ifconfig ${eth_if} 2>/dev/null | perl -ne 'print "$1\n"if/mask:\s*(\S+)/i')
        eth_bc=$(ifconfig ${eth_if} 2>/dev/null | perl -ne 'print "$1\n"if/bcast:\s*(\S+)/i')
       	exec 2>/dev/tty
	return 0
}
function usage(){
	echo "usage: $(basename $0) <-network network> [-netmask netmask] [-usepkey] [-eth eth-if] [-ib ib-if] [-mtu mtu] [-os RH|SUSE] [-noactive] [-nocolor] [-show] [-overwrite] [-backup] [-dhcp ]"
}

# ============================================================
# 			MAIN
# ============================================================
config_dhcp=0
overwrite=0
show=0
backup_netscript=0
start_if=0
use_pkey=0
while [[ ! -z "$1" ]] ; do
        case $1 in
                -overwrite)
			overwrite=1
                        shift
                ;;
                -backup)
			backup_netscript=1
                        shift
                ;;
                -dhcp)
			config_dhcp=1
                        shift
                ;;
                -usepkey)
			use_pkey=1
                        shift
                ;;
                -eth)
			given_eth=$2
                        shift
                        shift
                ;;
                -network)
			given_network=$2
                        shift
                        shift
                ;;
                -netmask)
			given_netmask=$2
                        shift
                        shift
                ;;
                -ib)
			given_if=$2
                        shift
                        shift
                ;;
                -mtu)
			given_mtu=$2
                        shift
                        shift
		;;
                -os)
			LIN_DIST=$2
                        shift
                        shift
                ;;
                -show)
			show=1
                        shift
                ;;
                -noactive)
			given_active=0
                        shift
                ;;
                -start)
			start_if=1
                        shift
                ;;
                -nocolor)
			disable_color_print
                        shift
                ;;
                *)
                        echo "unknown switch $1"
			usage
                        exit 1
                ;;
        esac
done

if [ -z $given_if ] ; then
	given_if=ib0
fi

choose_netscript $given_if
if [ $config_dhcp -eq 1 ] ; then
	ib_dynamic_set $given_if
	dhclient_set   $given_if
else

	if [ -z $given_network  ] ; then
		fatal "no network was given. use option -network or -dhcp"
	fi
	if [ $use_pkey -ne 0 ] ; then
		make_pkey_network
	fi
	if [ -z $given_eth ] ; then
		given_eth=eth0
	fi
	get_eth $given_eth
	if [ $? -ne 0 ] ; then		
		fatal "bad interface $given_eth"
	fi
	if [ -z $given_mtu ] ; then
		given_mtu=1500
	fi
	if [ -z $given_active ] ; then
		given_active=1
	fi
	if [ ! -z $given_netmask ] ; then
		eth_nm=$given_netmask
	fi
	calc_ip=$( perl -e 'use Socket ; $iaddr = inet_aton("'$eth_ip'") ; $netmask = inet_aton("'$eth_nm'") ; $newip = inet_aton("'$given_network'") ; $newip= ($iaddr & ~ $netmask) | $newip ; $NIP=inet_ntoa($newip);print $NIP' )
	calc_bc=$( perl -e 'use Socket ; $iaddr = inet_aton("'$eth_bc'") ; $netmask = inet_aton("'$eth_nm'") ; $newip = inet_aton("'$given_network'") ; $newip= ($iaddr & ~ $netmask) | $newip ; $NIP=inet_ntoa($newip);print $NIP' )

	ib_static_set $given_if $calc_ip $given_network $eth_nm $calc_bc $given_mtu $given_active
fi
	
if [ $start_if -eq 1 ] ; then
	ifup $given_if
fi
		
exit 0
			

